function sign(x)
{
	if(x>0){return 1;}
	else if(x==0){return 0;}
	else
	{return -1;}
}
function factorial(n)
{
    var i=n;
    var re=1;
    while(i>1)
    {
        re*=i;
        i--;
    }
    return re;
    
}
//n个元素有n!的排序情况
//每种情况对应一个逆序数
//返回所有情况

function pailie_map_i_to_reverse_order(n)
{
    var num=factorial(n);
    var re=new Array(n*num);
    var chu,yu;

    //把这些情况绑定索引(0...(n!-1))
    //给一个数，返回它对应的情况
    for(var i=0;i<num;i++)
    {
        chu=i;
        for(var j=0;j<n;j++)
        {
            yu=chu%(j+1);
            chu=parseInt(chu/(j+1));
            re[i*n+n-1-j]=yu;
        }

    }
    return re;
}
//
function map_reverse_order_to_pailie(r,n) 
{
    var num=factorial(n);
    var re=new Array(n*num); 
    for(var i=0;i<num;i++)
    {
        for(var j=0;j<n;j++)
        {
            re[i*n+j]=j;
        }
    }
    var ix,iy,temp;
    for(var i=0;i<num;i++)
    {
        for(var j=0;j<n;j++)
        {
            ix=i*n+j;
            iy=i*n+j+r[i*n+j];
            for(var l=iy;l>ix;l--)
            {
                temp=re[l-1];
                re[l-1]=re[l];
                re[l]=temp;
            }
        }
    }
    return re;
}
//计算从n个元素取出m个元素的所有情况
function increase_a_step_for_combination(m,n,temp_array,temp_array_i)
{
    var temp_i;
    var mu_array=temp_array;
    for(var i=0;i<m;i++)
    {
        temp_i=mu_array[i+temp_array_i]+1;
        if(temp_i<n)
        {
            if((i+1)<m&&temp_i>=mu_array[temp_array_i+i+1])
            {
                continue;
            }
            for(var j=0;j<m;j++)
            {
                mu_array[temp_array_i+m+j]=mu_array[temp_array_i+j];
            }
            //运行到这里一次就结束
            mu_array[i+temp_array_i+m]=temp_i;
            for(var j=0;j<i;j++)
            {
                mu_array[temp_array_i+m+j]=j;
            }
            return 1;

        }
        else
        {
            return 0;
        }
    }
    return 0;
}

function compute_combination(m,n)
{
    if(m>n)
    {
        return null;
    }
    var len=1;
    for(var i=0;i<m;i++)
    {
        len*=(n-i);
    }
    len=len/factorial(m);
   // console.log(len)

    var re=new Array(len*m);
    for(var i=0;i<m;i++)
    {
        re[i]=i;
    } 
    for(var i=0;i<len-1;i++)
    {
        increase_a_step_for_combination(m,n,re,i*m);
    }
    return re;

}
var situ=pailie_map_i_to_reverse_order(4);
var situ1=map_reverse_order_to_pailie(situ,4);
var situ2=compute_combination(4,6);
for(var i=0;i<15;i++)
{
    for(var j=0;j<4;j++)
    {
        console.log(situ2[j+i*4]);
    }
    console.log("\n");
}
var n_=factorial(4);
// for(var i=0;i<n_;i++)
// {
//     for(var j=0;j<4;j++)
//     {
//         console.log(situ1[i*4+j]);
//     }
//     console.log("\n");
// }

